package com.li.commons.util;

import java.lang.reflect.Method;
import java.util.LinkedHashMap;
import java.util.Map;

import org.apache.commons.lang3.reflect.MethodUtils;
import org.springframework.core.enums.LabeledEnum;

public class EnumUtil { 
	
    public static String getText(Class<?> ref , Object code){  
        return parseEumn(ref).get(String.valueOf(code)) ;   
    }  
      
    public static <T> Map<String, String> parseEumn(Class<T> ref){  
        Map<String, String> map = new LinkedHashMap<String, String>() ;  
        if(ref.isEnum()){  
            T[] ts = ref.getEnumConstants() ;   
            for(T t : ts){  
                String text = getInvokeValue(t, "getText") ;   
                Enum<?> tempEnum = (Enum<?>) t ;  
                if(text == null){  
                    text = tempEnum.name() ;  
                }  
                String code = getInvokeValue(t, "getCode") ;   
                if(code == null){  
                    code = String.valueOf(tempEnum.ordinal()) ;  
                }  
                map.put(code , text ) ;   
            }  
        }  
        return map ;  
    }  
      
    static <T> String getInvokeValue(T t , String methodName){  
        try {  
            Method method = MethodUtils.getAccessibleMethod(t.getClass() , methodName);
            Object textResult = method.invoke(t);
            String text = null;
            if(textResult!=null){
            	text = String.valueOf(textResult);
            }
            return text ;  
        } catch (Exception e) { 
        	e.printStackTrace();
            return null ;  
        }  
    } 
}  

